 

REM------------COMPILER.2 VERSION 1.22  (C) NASPITE LABS 12.30.17
REM------------SETUP
0 KJ =  PEEK (43626)
 1  ONERR  GOTO 9999
 10  DIM P$(200):P = 0:PP = 30000: DIM PG$(200)
 11 ZA$ = "COMPILE.A":ZZ$ = "COMPILE.B"
 12  PRINT  CHR$ (4);"OPEN";ZA$;",S3": PRINT  CHR$ (4)
 13  PRINT  CHR$ (4);"OPEN";ZZ$;",S3": PRINT  CHR$ (4);"CLOSE";ZZ$
 14  PRINT  CHR$ (4);"APPEND";ZZ$;",S3": PRINT  CHR$ (4)


REM-----------CHECK TYPE OF INSTRUCTION
 20  GOSUB 1000:L =  LEN (ZB$):NM = NM + 1: PRINT NM;"  ";ZB$
 21  IF L < 3 THEN  PRINT "LENGTH OF INSTRUCTION TOO SMALL: ";ZB$;" @110": STOP 
 22  IF ZB$ = "END" GOTO 100
 23  IF L = 3 THEN ZB$ = " " + ZB$:PP = PP + 1: GOSUB 1010: GOTO 20
 24  IF ZB$ = "START" GOTO 1050
 25  IF ZB$ = "COMMAND" THEN  GOSUB 1010: GOSUB 1000: GOSUB 1010: GOSUB 1000: GOSUB 1010:PP = PP + 3: GOTO 20
 26  IF ZB$ = "NEW.LINE" THEN ZB$ = "NEW":P = P + 1:P$(P) =  STR$ (PP): GOSUB 1010: GOSUB 1000: GOTO 20
 30 ZC$ = "":ZD$ = "":ZE$ = "":ZF$ = "": ONERR  GOTO 80
 31 ZD$ =  RIGHT$ (ZB$,L - 4):LL =  LEN (ZD$)
 32 ZE$ =  LEFT$ (ZD$,1)
 33 IF ZE$="(" THEN ZB$=" "+ZB$:GOTO 50
 34 ZC$ =  LEFT$ (ZB$,3)
 35  IF ZC$ = "BCC" GOTO 50
 36  IF ZC$ = "BEQ" GOTO 50
 37  IF ZC$ = "BCS" GOTO 50
 38  IF ZC$ = "BNE" GOTO 50
 39  IF ZC$ = "BMI" GOTO 50
 40  IF ZC$ = "BPL" GOTO 50
 41  IF ZC$ = "BVS" GOTO 50
 45  IF ZE$ = "#" GOTO 60
 46 N =  VAL (ZD$): GOSUB 1020
 47 ZB$ = " " + ZC$ + " " + H$: GOSUB 1010:HJ =  VAL (ZD$)
 48 PP = PP + 2: IF HJ > 255 THEN PP = PP + 1
 49  GOTO 20
 50  GOSUB 1010:PP = PP + 2: GOTO 20
 60 ZF$ =  RIGHT$ (ZD$,LL - 1):N =  VAL (ZF$): GOSUB 1020:ZB$ = " " + ZC$ + " #" + H$: GOSUB 1010:PP = PP + 2: GOTO 20
 80  PRINT "ERR AT 80": STOP 


REM--------------ENDING FIRST SECTION- AKA COMPILE.B
 100  PRINT  CHR$ (4);"CLOSE": ONERR  GOTO 104
 101  PRINT  CHR$ (4);"OPEN COMPILED.LINES,S";KJ
 102  PRINT  CHR$ (4);"READ COMPILED.LINES"
 103  FOR A = 1 TO P: INPUT PG$(A): NEXT 
 104  PRINT  CHR$ (4);"CLOSE"
 105  PRINT  CHR$ (4);"OPEN PROGRAM.LISTING,S";KJ
 106  PRINT  CHR$ (4);"WRITE PROGRAM.LISTING"
 107  FOR A = 1 TO P: PRINT PG$(A);" - ";P$(A): NEXT 
 108  PRINT ".....END....": PRINT  CHR$ (4);"CLOSE"
 109  PRINT : FOR A = 1 TO P: PRINT PG$(A);" - ";P$(A): NEXT : PRINT : GOTO 5000


REM----------------READ INPUT FILE
 1000 ZB$ = "": PRINT  CHR$ (4);"READ";ZA$
 1001  GET Z$: IF  ASC (Z$) = 141 OR  ASC (Z$) = 13 THEN  GOTO 1005
 1002 ZB$ = ZB$ + Z$: GOTO 1001
 1005  PRINT  CHR$ (4):L =  LEN (ZB$): IF  LEN (ZB$) < 5 THEN  RETURN 
 1006  IF  RIGHT$ (ZB$,2) = ",X" THEN ZT$ =  RIGHT$ (ZB$,2):ZB$ =  LEFT$ (ZB$,L - 2):ZT = 100
 1007  IF  RIGHT$ (ZB$,2) = ",Y" THEN ZT$ =  RIGHT$ (ZB$,2):ZB$ =  LEFT$ (ZB$,L - 2):ZT = 100
 1008  RETURN 


REM----------------WRITE OUTPUT FILE
 1010  IF ZT > 0 THEN ZB$ = ZB$ + ZT$
 1011  PRINT  CHR$ (4);"WRITE";ZZ$
 1012  PRINT ZB$: PRINT  CHR$ (4):ZT$ = "":ZT = 0: RETURN 


REM----------------HEX CONVERSION - 'INPUT N - OUT H$
 1020 H$ = ""
 1021 NN =  INT (N / 16):H = N - NN * 16
 1022 N = NN:H = H + 1:H$ =  MID$ ("0123456789ABCDEF",H,1) + H$
 1023  IF N > 0 GOTO 1021
 1024  RETURN 

REM---------------START CODE
 1050 ZB$ = "CALL -151": GOSUB 1010
 1051 ZB$ = "!": GOSUB 1010
 1052 ZB$ = "752F:NOP": GOSUB 1010
 1053  ONERR  GOTO 1056
 1054  PRINT  CHR$ (4);"OPEN VARIABLES,S";KJ: PRINT  CHR$ (4);"READ VARIABLES"
 1055  INPUT ZB$: GOTO 1055
 1056  PRINT  CHR$ (4);"CLOSE VARIABLES": CALL  - 3288
 1057 ZB =  VAL (ZB$):ZB = ZB + 3:N = ZB:PP = N: GOSUB 1020:ZB$ = " JMP $" + H$
 1058  GOSUB 1010:ZB = ZB - 30003: FOR A = 1 TO ZB:ZB$ = " BRK": GOSUB 1010: NEXT 
 1059 N = (ZB): GOSUB 1020:HG$ = " LDX #" + H$:ZB$ = HG$: GOSUB 1010:PP = PP + 2: GOTO 20


REM ----------------------
 5000 ZA$ = ZZ$:ZZ$ = "COMPILE.C":PZ = 1:UZ = 30000: ONERR  GOTO 7000
 5001  PRINT  CHR$ (4);"OPEN";ZA$;",S3": PRINT  CHR$ (4)
 5002  PRINT  CHR$ (4);"OPEN";ZZ$;",S3": PRINT  CHR$ (4)
 5003  FOR A = 1 TO 3: GOSUB 1000: GOSUB 1010: NEXT 

 5010  GOSUB 1000:UL =  LEN (ZB$): PRINT UZ;":  "ZB$
 5011  IF ZB$ = "NEW" THEN  GOTO 5010
 5012  IF UL < 4 THEN  PRINT "INSTRUCTION TOO SMALL: ";ZB$;" @5012": STOP 
 5013  IF UL = 4 THEN UZ = UZ + 1: GOSUB 1010: GOTO 5010
 5014  IF ZB$ = "COMMAND" THEN  GOTO 6000

 5015  IF ZB$ = " JSR $0000" THEN  GOTO 5030
 5016  IF  LEFT$ (ZB$,3) = "BCC" OR  LEFT$ (ZB$,3) = "BMI" THEN  GOTO 5100
 5017  IF  LEFT$ (ZB$,3) = "BEQ" THEN  GOTO 5100
 5018  IF  LEFT$ (ZB$,3) = "BCS" OR  LEFT$ (ZB$,3) = "BPL" THEN  GOTO 5100
 5019  IF  LEFT$ (ZB$,3) = "BNE" OR  LEFT$ (ZB$,3) = "BVS" THEN  GOTO 5100
 
 5020 ZC =  LEN (ZB$):ZC$ =  RIGHT$ (ZB$,ZC - 5):ZC = ZC - 5
 5021 IF LEFT$(ZC$,1)="(" THEN GOTO 5028
 5022  IF  LEFT$ (ZC$,1) = "$" THEN  GOTO 5040
 5023  IF  LEFT$ (ZC$,1) = "#" THEN  GOTO 5028
 5024  IF ZC > 3 THEN  GOTO 5029
 5025  IF  LEN (ZC$) = 3 THEN  GOTO 5029

 5028 UZ = UZ + 2: GOSUB 1010: GOTO 5010
 5029 UZ = UZ + 3: GOSUB 1010: GOTO 5010

 5030 N =  VAL (P$(PZ)): GOSUB 1020:ZB$ = " JSR " + H$:PZ = PZ + 1:UZ = UZ + 3: GOSUB 1010: GOTO 5010

 5040  IF ZC > 3 THEN  GOTO 5029
 5041  GOTO 5029

 5100 UL =  LEN (ZB$):ZC$ =  RIGHT$ (ZB$,UL - 4):ZC =  VAL (ZC$)
 5101  IF ZC < 0 THEN ZC = UZ + ZC + 2: GOTO 5105
 5102 ZC = ZC + 2 + UZ
 5105 N = ZC: GOSUB 1020
 5106 ZB$ =  LEFT$ (ZB$,3):ZB$ = " " + ZB$ + " ":ZB$ = ZB$ + H$:UZ = UZ + 2: GOSUB 1010: GOTO 5010


 6000  GOSUB 1000
 6001  IF ZB$ = "GOSUB" THEN  GOSUB 6010:ZB$ = " JSR ": GOTO 6005
 6002  IF ZB$ = "GOTO" THEN  GOSUB 6010:ZB$ = " JMP ": GOTO 6005
 6003  IF ZB$ = "NEXT" THEN  GOSUB 6010:A = A + 1:ZB$ = " JMP ": GOTO 6005
 6004  PRINT "ERR... NO SUCH SPECIAL COMMAND": PRINT  CHR$ (4);"CLOSE": STOP 

 6005 N =  VAL (P$(A)): GOSUB 1020:ZB$ = ZB$ + H$: GOTO 5029

 6010  GOSUB 1000
 6011  FOR A = 1 TO P
 6012  IF ZB$ = PG$(A) THEN  RETURN 
 6013  NEXT 
 6014  PRINT "ERR... NO SUCH LINE: ";ZB$: GOTO 6004

 7000  PRINT : PRINT : INPUT "*** SAVE PROGRAM AS: ";GG$
 7002 KJ$ =  STR$ (KJ):PP = UZ - 30000:ZB$ = "BSAVE " + GG$ + ",S" + KJ$ + ",A30000,L":ZC$ =  STR$ (PP):ZB$ = ZB$ + ZC$: GOSUB 1010:ZG$ = ZB$
 7003 ZB$ = "E003G": GOSUB 1010: PRINT  CHR$ (4);"CLOSE"
 7004  PRINT  CHR$ (4);"EXEC COMPILE.C,S3"
